本文源码请见我的GitHub
这个是用来解决三位思维数据等高维度的问题。 实践中通过层级索引hierarchical indexing 配合多个不同的等级 可以将高位转为一维或者二维的低维度数据
1 | import numpy as np |
3.6.1 多级索引Series
1 | #用一个元组表示索引 |
1 | pop |
(California, 2000) 165416
(California, 2001) 213884
(New York, 2000) 665468
(New York, 2001) 598949
dtype: int64
好方法!!! Pandas 多级索引
1 | index = pd.MultiIndex.from_tuples(index) |
MultiIndex(levels=[['California', 'New York'], [2000, 2001]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
1 | pop = pop.reindex(index) |
California 2000 165416
2001 213884
New York 2000 665468
2001 598949
dtype: int64
1 | pop[:, 2001] |
California 213884
New York 598949
dtype: int64
3.高维数据的多级索引
1 | #unstack()方法可以快速将一个多级索引的Series转化为普通的DataFrame |
1 | pop_df = pop.unstack() |
1 | pop_df |
2000 | 2001 | |
---|---|---|
California | 165416 | 213884 |
New York | 665468 | 598949 |
1 | pop_df.stack() |
California 2000 165416
2001 213884
New York 2000 665468
2001 598949
dtype: int64
3.6.2 多级索引的创建
1 | df = pd.DataFrame(np.random.rand(4,2), index = [['a','a', 'b', 'b'], [1,2,1,2]], columns= [ 'data1', 'data2']) |
1 | df |
data1 | data2 | ||
---|---|---|---|
a | 1 | 0.860844 | 0.944118 |
2 | 0.403881 | 0.358596 | |
b | 1 | 0.988218 | 0.806094 |
2 | 0.461608 | 0.547859 |
1 | #为Series或者DataFrame 创建多级索引的最直接方法是将index 参数设置为至少二维的索引数据 MultiIndex 创建在后台完成 |
1.显式创建多级索引
1 | pd.MultiIndex.from_arrays([['a','a','b','b'], [1,2,1,2]]) |
MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
1 | #可以用两个索引的笛卡尔积创建MultiIndex: |
MultiIndex(levels=[['a', 'b'], [1, 2]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
2.多级索引的等级名称
1 | pop |
California 2000 165416
2001 213884
New York 2000 665468
2001 598949
dtype: int64
1 | pop.index.names = ['state', 'year'] |
1 | pop |
state year
California 2000 165416
2001 213884
New York 2000 665468
2001 598949
dtype: int64
3.多级列索引
可以在列索引的第一级查询从而检索出整个DataFrame
3.6.3多级索引的取值与切片
1 | pop |
state year
California 2000 165416
2001 213884
New York 2000 665468
2001 598949
dtype: int64
通过对多个级别的索引值获取单个元素
1 | pop['California', 2000]#相当于一个二维坐标定位 |
165416
1 | # 局部取值 只索引某一个层级 |
year
2000 165416
2001 213884
dtype: int64
1 | #局部切片 |
state year
California 2000 165416
2001 213884
New York 2000 665468
2001 598949
dtype: int64
1 | #剩下的和基本的索引操作是一样的 |
- DataFrame多级索引
1 | #先创建一个体检数据 |
1 | index = pd.MultiIndex.from_product([[2013, 2014], [1,2]], names =['year', 'visit']) |
1 | health_data = pd.DataFrame(data, index = index ,columns=columns) |
subject | Bob | Guido | Sue | ||||
---|---|---|---|---|---|---|---|
type | HR | Temp | HR | Temp | HR | Temp | |
year | visit | ||||||
2013 | 1 | 41.0 | 37.3 | 45.0 | 37.2 | 45.0 | 37.4 |
2 | 47.0 | 37.3 | 39.0 | 37.2 | 41.0 | 37.7 | |
2014 | 1 | 42.0 | 37.7 | 42.0 | 37.4 | 37.0 | 37.3 |
2 | 47.0 | 37.0 | 41.0 | 37.8 | 46.0 | 37.3 |
1 | #选取Guido的心率数据 |
year visit
2013 1 45.0
2 39.0
2014 1 42.0
2 41.0
Name: (Guido, HR), dtype: float64
1 | #也可以好用loc iloc ix索引器 |
subject | Bob | ||
---|---|---|---|
type | HR | Temp | |
year | visit | ||
2013 | 1 | 41.0 | 37.3 |
2 | 47.0 | 37.3 |
1 | health_data.loc[:, ('Bob','HR')] |
year visit
2013 1 41.0
2 47.0
2014 1 42.0
2 47.0
Name: (Bob, HR), dtype: float64
3.6.4 多级索引行列转换
1.有序的索引和无序索引 。。。。xian